package com.yunli.mall.common.schema;

import java.util.Objects;

/**
 * @author wangyue
 * @description 枚举的接口
 * @date 2019-11-28 21:49
 */
public interface BaseEnum {

    /**
     * 返回枚举具体值的编码
     *
     * @return Integer
     */
    Integer getCode();

    /**
     * 返回枚举具体值的描述
     *
     * @return String
     */
    String getDesc();

    /**
     * 根据code获取枚举的desc
     *
     * @param clazz
     * @param code
     * @return
     */
    static String convert2Desc(Class<? extends BaseEnum> clazz, Integer code) {
        // 获取枚举
        Enum e = convertCode2Enum(clazz, code);
        if (Objects.isNull(e)) {
            // null就返回
            return null;
        } else {
            // BaseEnum的取desc
            return ((BaseEnum) e).getDesc();
        }
    }

    /**
     * 根据code获取枚举
     *
     * @param clazz
     * @param code
     * @return
     */
    static Enum convertCode2Enum(Class<? extends BaseEnum> clazz, Integer code) {
        if (null == code) {
            return null;
        }
        // 遍历比较code,返回对应的enum
        for (BaseEnum enumConstant : clazz.getEnumConstants()) {
            if (code.equals(enumConstant.getCode())) {
                return (Enum) enumConstant;
            }
        }
        return null;
    }

    /**
     * 根据desc或name获取枚举
     *
     * @param clazz
     * @param desc
     * @return
     */
    static Enum convertDesc2Enum(Class<? extends BaseEnum> clazz, String desc) {
        if (null == desc) {
            return null;
        }
        // 遍历枚举值
        for (BaseEnum enumConstant : clazz.getEnumConstants()) {
            // 如果有desc相同的就返回枚举
            if (desc.equals(enumConstant.getDesc())) {
                return (Enum) enumConstant;
            }
            // 如果desc都没有或desc是null,就返回枚举的name
            if (((Enum) enumConstant).name().equals(desc)) {
                return (Enum) enumConstant;
            }
        }
        return null;
    }

}
